javascript oop、instanceof 和基类
全部标签 代码如下:代码:#includeusingnamespacestd;classAnimal{inta;public:Animal(inta):a(a){}intgeta(){returna;}};classBird:virtualpublicAnimal{stringb;public:Bird(inta,stringb):Animal(a),b(b){}};classFish:virtualpublicAnimal{intf;public:Fish(inta,intf):Animal(a),f(f){}};classUnknown:publicBird,publicFish{charu
为什么不建议虚基类中有数据成员?函数成员呢?如果我有一个所有派生类共有的任务,虚拟基类是否可以执行该任务,或者派生类是否应该继承两个类-从虚拟接口(interface)和执行任务的普通基类?谢谢。 最佳答案 作为一种实践,您应该只使用虚拟继承来定义接口(interface),因为它们通常与多重继承一起使用,以确保派生类中只存在该类的一个版本。纯接口(interface)是最安全的多重继承形式。当然,如果您知道自己在做什么,您可以随意使用多重继承,但如果您不小心,它可能会导致代码脆弱。虚拟继承的最大缺点是它们的构造函数是否带有参数。如
我正在尝试使用std::bind()创建一个函数,该函数将调用虚函数的基类版本而不是调用派生类的版本。structBase{virtualvoidfoo(){cout我从elsewhere了解到你通常不能以这样的“反虚拟”方式调用基本函数。明显的异常(exception)是通用范式:voidDerived::bar(){Base::bar();}由于表达式Base::bar()在Derived的方法中被识别为“反虚拟”(在我暗示的意义上),是否可以绑定(bind)到Base::bar()以在Derived的一种方法中所需的方式?例如。像这样的东西:voidDerived::bar(){
假设我有一个抽象基类Parent和子类Child1和Child2。如果我有一个接受Parent*的函数,有没有办法(可能使用RTTI?)在运行时确定该函数实际接收到的是Child1*还是Child2*?到目前为止,我在这里使用RTTI的经验是,当foo是父类*时,typeid(foo)返回typeid(Parent*),而不管foo是哪个子类的成员。 最佳答案 你需要查看解引用指针的typeid,而不是指针本身;即,typeid(*foo),而不是typeid(foo)。询问取消引用的指针将为您提供动态类型;如您所见,询问指针本身只
我有以下代码:structA{};structBase{virtualA&internal()=0;};structDerives:publicBase{auto&internal()override{//这无法通过冲突的返回类型进行编译(在coliru上测试-使用gcc)-我的问题是为什么编译器不能推断出internal_(因此返回类型)是A?是否在不同的编译阶段为auto推导出类型,例如与检查虚拟覆盖的编译阶段?当然,如果您将auto替换为正确的类型,则可以编译-但这不是重点。(这里是clang错误,gcc有点类似)main.cpp:8:11:error:returntypeofv
我的代码可以用VC9(MicrosoftVisualC++2008SP1)编译,但不能用GCC4.2(在Mac上,如果重要的话)编译。如果我堆积足够多的限定符和关键字,我可以强制它在GCC中工作,但这似乎不对。这是展示我的问题的最小代码示例:templatestructB{typedefNn_type;//canderivedclassaccesstypedef?voidfoo(){}//canderivedclassaccessfunction?};templatestructD:publicB{typedefBb_type;typedeftypenameb_type::n_type
在VisualStudio2008中,编译器无法解析下面_tmain中对SetCustomer的调用并使其明确:templatestructProducer{voidSetConsumer(TConsumer*consumer){consumer_=consumer;}TConsumer*consumer_;};structAppleConsumer{};structMeatConsumer{};structShillyShallyProducer:publicProducer,publicProducer{};int_tmain(intargc,_TCHAR*argv[]){Shil
这个问题在这里已经有了答案:Whyisitundefinedbehaviortodelete[]anarrayofderivedobjectsviaabasepointer?(5个答案)关闭4年前。我这里有一段代码,我不明白为什么它会导致第22行(delete[]语句)出现段错误。你能给我解释一下吗?#include#includeclassA{size_ta[1000];public:virtual~A(){}};classB:publicA{public:floatb;virtual~B(){}};intmain(intargc,char**argv){A*b;b=newB[10]
在GMan'sanswerhere,restore_base类的析构函数不是virtual,所以我一直想知道它究竟是如何工作的。通常您希望restorer_base的析构函数仅在对象超出范围后执行,但派生的restorer_holder析构函数似乎真的被调用了。有谁愿意赐教吗? 最佳答案 需要虚拟析构函数的标准情况是voidfoo(){scoped_ptrobj=factory_returns_a_Derived();//...use'obj'here...}而您不的标准情况是voidfoo(){Derivedobj;//...us
关于虚拟基类继承的一些事情一直让我感到困惑......给定以下类:classA{virtualvoidfoo()=0;}classB:virtualA{voidfoo(){/*doX*/}}classC:virtualA{voidfoo(){/*doY*/}}classD:B,C{}这会编译吗?如果是这样,以下代码的结果是什么:Dd;A*a=&d;a->foo(); 最佳答案 它不应该编译,函数foo会产生歧义。由于A::foo()是纯虚函数,因此必须解决歧义。 关于c++-虚拟基类上的